// 校验工具类
import Vue from "vue";

class Check {
    // 存储校验值
    public checkValue: any;
    // 错误提示
    public errorMsg: any;
    // 当前校验项名称
    public prefixStr: any;

    constructor() {}

    // 开始校验
    start(value: any, prefix: any = ""): Check {
        this.checkValue = value;
        this.prefixStr = prefix;
        this.errorMsg = "";
        return this;
    }

    /*
     * 清空校验数据
     * @private
     * @memberof Check
     */
    private clear() {
        this.checkValue = "";
        this.prefixStr = "";
        this.errorMsg = "";
    }

    // 显示错误提示, 校验结束清空校验数据
    endShow() {
        if (this.errorMsg) {
            Vue.prototype.$toast(this.errorMsg);
        }
        return this.end();
    }

    // 校验结束, 清空校验信息
    end(): string {
        const _errorMsg = this.errorMsg;
        this.clear();
        return _errorMsg;
    }

    // 是否为空
    isNull(): Check {
        // 先判断之前校验是否通过，不通过直接返回
        if (this.errorMsg) {
            return this;
        }

        if (this.checkValue === "" || this.checkValue === undefined) {
            this.errorMsg = `${this.prefixStr}不能为空`;
        }

        return this;
    }

    // 是否是数字
    isNumber(): Check {
        // 先判断之前校验是否通过，不通过直接返回
        if (this.errorMsg) {
            return this;
        }
        const reg = /^\d+$/;
        if (!reg.test(this.checkValue)) {
            this.errorMsg = `${this.prefixStr}为数字类型`;
        }
        return this;
    }

    // 是否为手机号
    isTell(): Check {
        // 先判断之前校验是否通过，不通过直接返回
        if (this.errorMsg) {
            return this;
        }
        const reg = /^1\d{10}$/;
        if (!reg.test(this.checkValue)) {
            this.errorMsg = `请输入正确的${this.prefixStr}`;
        }
        return this;
    }

    // 是否为6位数字验证码
    isCode(): Check {
        // 先判断之前校验是否通过，不通过直接返回
        if (this.errorMsg) {
            return this;
        }
        const reg = /^\d{6}$/;
        if (!reg.test(this.checkValue)) {
            this.errorMsg = `请输入6位数字${this.prefixStr}`;
        }
        return this;
    }

    // 是否为身份证号码
    isIDCard(): Check {
        // 先判断之前校验是否通过，不通过直接返回
        if (this.errorMsg) {
            return this;
        }
        // 第一代身份证号码15位
        /**
         * [1-9]\d{5}                   前六位地区，非0打头
         *  \d{2}                       出生年份后两位00-99
         *  ((0[1-9])|(10|11|12))       月份，01-12月
         *  (([0-2][1-9])|10|20|30|31)  日期，01-31天
         *  \d{3}                       顺序码三位，没有校验码
         */
        const reg1 = /^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$/;
        if (this.checkValue.length === 15 && !reg1.test(this.checkValue)) {
            this.errorMsg = `请输入正确的${this.prefixStr}`;
        }
        // 第二代身份证号码18位
        /**
         * [1-9]\d{5}                 前六位地区，非0打头
         * (18|19|([23]\d))\d{2}      出身年份，覆盖范围为 1800-3999 年
         * ((0[1-9])|(10|11|12))      月份，01-12月
         * (([0-2][1-9])|10|20|30|31) 日期，01-31天
         * \d{3}[0-9Xx]：              顺序码三位 + 一位校验码
         */
        const reg2 = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
        if (this.checkValue.length === 18 && !reg2.test(this.checkValue)) {
            this.errorMsg = `请输入正确的${this.prefixStr}`;
        }
        return this;
    }

    // 密码判断（字母数字下划线）
    isPwd(): Check {
        // 先判断之前校验是否通过，不通过直接返回
        if (this.errorMsg) {
            return this;
        }
        const reg = /^\w+$/;
        if (!reg.test(this.checkValue)) {
            this.errorMsg = `${this.prefixStr}只能为数字字母下划线的组合`;
        }
        return this;
    }

    // 金钱判断 有一个最小值和最大值
    isMoney(min?: number, max?: number): Check {
        // 先判断之前校验是否通过，不通过直接返回
        if (this.errorMsg) {
            return this;
        }
        var reg = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)|(^[0-9]+\.$)/;
        if (reg.test(this.checkValue)) {
            if (min !== undefined && this.checkValue < min) {
                this.errorMsg = `请输入正确的${this.prefixStr}`;
                return this;
            }
            if (max !== undefined && this.checkValue > max) {
                this.errorMsg = `请输入正确的${this.prefixStr}`;
                return this;
            }
            return this;
        }
        this.errorMsg = `请输入正确的${this.prefixStr}`;
        return this;
    }

    // 无特殊字符（中文英文数字字母下划线）用于地址等校验
    isNormal(): Check {
        // 先判断之前校验是否通过，不通过直接返回
        if (this.errorMsg) {
            return this;
        }
        const reg = /^([\u4E00-\u9FA5\uF900-\uFA2D]|[\w])+$/;
        if (!reg.test(this.checkValue)) {
            this.errorMsg = `${this.prefixStr}不能含有特殊字符`;
        }
        return this;
    }

    // 邮箱判断
    isEmail(): Check {
        // 先判断之前校验是否通过，不通过直接返回
        if (this.errorMsg) {
            return this;
        }
        var reg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
        if (!reg.test(this.checkValue)) {
            this.errorMsg = `${this.prefixStr}格式错误`;
        }
        return this;
    }

    // 最小长度(包含)
    min(minLength: number): Check {
        // 先判断之前校验是否通过，不通过直接返回
        if (this.errorMsg) {
            return this;
        }
        if (this.checkValue.length < minLength) {
            this.errorMsg = `${this.prefixStr}最小长度为${minLength}`;
        }
        return this;
    }

    // 最大长度(包含)
    max(maxLength: number): Check {
        // 先判断之前校验是否通过，不通过直接返回
        if (this.errorMsg) {
            return this;
        }
        if (this.checkValue.length > maxLength) {
            this.errorMsg = `${this.prefixStr}最大长度为${maxLength}`;
        }
        return this;
    }
}

export default Check;
